package com.example.demo.service;

import com.example.demo.enumeration.Campus;
import com.example.demo.pojo.entity.User;
import com.example.demo.pojo.vo.ItemListVO;
import com.example.demo.pojo.vo.PageVO;
import com.example.demo.pojo.vo.UserDetailVO;
import com.example.demo.pojo.vo.UserProfileVO;

import java.util.List;

public interface UserService {
    /**
     * 检查电话号码是否已被注册
     * @param phone 需要检查的电话号码
     * @return 电话是否已被注册
     */
    boolean checkPhoneExists(String phone);

    /**
     * 检查用户名称是否已存在
     * @param name 需要检查的用户名称
     * @return 名称是否已存在
     */
    boolean checkNameExists(String name);

    /**
     * 查找对应id的用户
     * @param id 目标用户的id
     * @return 目标用户
     */
    User selectById(Long id);

    /**
     * 校验验证码
     * @param phone 目标手机号码
     * @param code 用户填入的验证码
     * @return 校验是否成功
     */
    boolean validateVerificationCode(String phone, String code);

    /**
     * 删除已校验成功的验证码
     * @param phone 目标手机号
     */
    void deleteVerificationCode(String phone);

    /**
     * 删除目标用户jwt令牌
     * @param id 目标用户的id
     */
    void deleteToken(Long id);

    /**
     * 查找对应id的用户名称
     * @param id 目标用户id
     * @return 目标用户名称
     */
    String selectNameById(Long id);

    /**
     * 查找对应电话号码的用户
     * @param phone 目标用户的电话号码
     * @return 目标用户
     */
    User selectByPhone(String phone);

    /**
     * 查找对应名称的用户
     * @param name 目标用户的名称
     * @return 目标用户
     */
    User selectByName(String name);

    /**
     * 注册新用户
     * @param phone 新用户的电话号码
     * @param name 新用户的名称
     * @param password 新用户的密码
     * @param studentId 新用户学号
     * @param campus 新用户校区
     * @return 操作是否成功
     */
    boolean register(String phone, String name, String password, String studentId, Campus campus);

    /**
     * 检查用户密码是否正确
     * @param phone 用户手机号码
     * @param password 用户输入的密码
     * @return 密码是否正确
     */
    boolean checkPassword(String phone, String password);

    /**
     * 生成用户jwt令牌并将其存储到redis
     * @param id 用户id
     * @return jwt令牌
     */
    String generateUserToken(Long id);

    /**
     * 获取当前登录的用户id
     * @return 用户id
     */
    Long getCurrentUserId();

    /**
     * 获取当前登录的用户
     * @return 目标用户
     */
    User getCurrentUser();

    /**
     * 获取当前登录的用户的简介
     * @return 带有目标用户简介数据的VO
     */
    UserProfileVO getCurrentUserProfile();

    /**
     * 获取指定用户简介
     * @param id 目标用户id
     * @return 带有目标用户简介数据的VO
     */
    UserProfileVO getUserProfile(Long id);

    /**
     * 获取指定用户详情
     * @param id 目标用户id
     * @return 带有目标用户详情数据的VO
     */
    UserDetailVO getUserDetail(Long id);

    /**
     * 更改当前用户基本信息
     * @param name 用户名称
     * @param campus 用户校区
     * @return 操作是否成功
     */
    boolean updateInfo(String name, Campus campus);

    /**
     * 修改当前用户头像
     * @param url 用户新头像url地址
     * @return 操作是否成功
     */
    boolean updatePicture(String url);

    /**
     * 修改用户密码
     * @param password 用户新密码
     * @param id 需要更新的用户id
     * @return 操作是否成功
     */
    boolean updatePassword(String password, Long id);

    /**
     * 查找当前用户收藏信息id
     * @param itemId 商品id
     * @return 收藏信息id
     */
    Long selectFavouriteIdByIds(Long itemId);

    /**
     * 添加收藏
     * @param itemId 要收藏的商品id
     * @return 操作是否成功
     */
    boolean addFavourite(Long itemId);

    /**
     * 取消收藏
     * @param itemId 要取消收藏的商品id
     * @return 操作是否成功
     */
    boolean deleteFavourite(Long itemId);

    /**
     * 获取当前用户收藏列表
     * @return  当前用户收藏列表
     */
    List<ItemListVO> getFavouriteList();

    /**
     * 添加关注
     * @param followedId 被关注的用户id
     * @return 操作是否成功
     */
    boolean addFollow(Long followedId);

    /**
     * 查找当前用户关注信息id
     * @param followedId 被关注的用户id
     * @return 关注信息id
     */
    Long selectFollowIdByIds(Long followedId);

    /**
     * 取消关注
     * @param followedId 要取消关注的用户id
     * @return 操作是否成功
     */
    boolean deleteFollow(Long followedId);

    /**
     * 获取当前用户关注列表
     * @return 当前用户关注列表
     */
    List<UserProfileVO> getFollowList();

    /**
     * 查找目标浏览信息的id
     * @param userId 目标浏览信息所属用户id
     * @param itemId 目标浏览信息所浏览的商品id
     * @return 目标浏览信息的id
     */
    Long selectViewHistoryIdByIds(Long userId, Long itemId);

    /**
     * 删除浏览记录
     * @param itemId 浏览记录所浏览的商品id
     * @return 操作是否成功
     */
    boolean deleteViewHistory(Long itemId);

    /**
     * 分页查询当前用户浏览记录
     * @param page 当前页码
     * @return 带有用户浏览记录数据的VO
     */
    PageVO getViewHistory(int page);
}
